<?php

namespace app\common\service\driver;

use app\common\constant\driving\CommonConstant;
use app\common\constant\driving\DriverMoneyLogConstant;
use app\common\model\driving\DriverRechargeOrder;
use think\Db;
use think\Exception;

/**
 * 司机充值服务类
 **/
class DriverRechargeOrderService
{

    /**
     * 充值
     *
     * @param string $amount 充值金额
     * @param string $paytype 支付类型
     * @param string $apptype 支付方法
     * @param mixed $user 用户信息
     * @return array
     */
    public static function create($amount, $paytype, $apptype, $user)
    {
        $epay = get_addon_info('epay');
        if (empty($epay) || !$epay['state']) {
            except("请先在后台安装并配置微信支付宝整合插件");
        }
        if ($paytype == CommonConstant::PAYTYPE_WECHAT) {
            except('微信APP支付暂未开通');
        }

        $response = [];
        $order_no = '1' . get_order_sn($user->id);
        $payamount = $amount;
        $data = [
            'user_id' => $user->id,
            'order_no' => $order_no,
            'amount' => $amount,
            'payamount' => $payamount,
            'paytype' => $paytype,
            'apptype' => $apptype,
            'status' => CommonConstant::STATUS_CREATED,
        ];
        try {
            $order = DriverRechargeOrder::create($data);
        } catch (Exception $e) {
            except($e->getMessage());
        }

        if (config('site.is_pay') == 0) {
            $result = self::order_settle($payamount, $order_no, 'recharge123456', $paytype);
            if (!$result['code']) {
                except($result['msg']);
            }
            return compact('paytype', 'apptype', 'response');
        }

        $order_cancel_time = config('site.order_cancel_time');
        $delay = $order_cancel_time * 60; // 秒数
        // 微信 【交易结束时间】 订单失效时间，遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，TIMEZONE表示时区（+08:00表示东八区时间，领先UTC8小时，即北京时间）。例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
        // 支付宝 订单绝对超时时间。格式为yyyy-MM-dd HH:mm:ss。超时时间范围：1m~15d。注：time_expire和timeout_express两者只需传入一个或者都不传，两者均传入时，优先使用time_expire。
        $time_expire = CommonConstant::PAYTYPE_WECHAT ? date('Y-m-d') . 'T' . date('H:i:s', time() + $delay) . '+08:00' : date('Y-m-d H:i:s', time() + $delay);
        $custom = [
            'time_expire' => $time_expire,
        ];
        $params = [
            'amount' => $payamount,
            'orderid' => $order_no,
            'type' => $paytype,
            'title' => "充值订单，{$payamount}元",
            'method' => $apptype,
            'custom' => $custom,
        ];
        $response = \app\api\controller\Pay::experience($params, 'recharge');

        // 队列
        \think\Queue::later($delay, '\app\common\job\OrderJob@RechargeOrderExpiredRun', ['order_id' => $order->id]);

        return compact('paytype', 'apptype', 'response');
    }

    /**
     * 充值业务逻辑处理 1
     **/
    public static function order_settle($payamount, $out_trade_no, $trade_no, $paytype)
    {
        $order = DriverRechargeOrder::where(['order_no' => $out_trade_no])
            ->field('id,user_id,payamount,status')
            ->find();
        if (!$order) {
            return V(0, '订单不存在');
        }
        if ($payamount != $order['payamount']) {
            return V(0, '订单支付金额不一致');
        }
        if ($order['status'] != CommonConstant::STATUS_CREATED) {
            return V(0, '非待支付状态无法支付');
        }

        Db::startTrans();
        try {
            $log_data = [
                'driver_id' => $order['user_id'],
                'type' => DriverMoneyLogConstant::TYPE_3,
                'change_type' => DriverMoneyLogConstant::CHANGE_TYPE_1,
                'money' => $payamount,
                'memo' => $out_trade_no,
            ];
            DriverService::money($log_data,$order['user_id'],[],'money');
            $order->payamount = $payamount;
            $order->paytime = date('Y-m-d H:i:s');
            $order->status = CommonConstant::STATUS_PAID;
            $order->transaction_id = $trade_no;
            $order->save();
            Db::commit();
        } catch (Exception $e) {
            Db::rollback();
            return V(0, $e->getMessage());
        }
        return V(1, '支付成功');
    }

}
